#pragma once

#include "JsonForward.hpp"
#include "nlohmann/json.hpp"
#include "../glm/vec3.hpp"
#include "../glm/dvec3.hpp"

CYBERTRON_BEGIN

class JsonReader
{
public:
	CybertronCoreAPI static bool loadFile(
		nlohmann::json& jsonNode,
		const std::string& filename);

	CybertronCoreAPI static bool loadString(
		nlohmann::json& jsonNode,
		const std::string& content);

	CybertronCoreAPI static bool hasValue(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static const nlohmann::json& getChild(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static std::string getString(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static std::string getString(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static vec3 getVec3(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static vec3 getVec3(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static dvec3 getVec3d(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static dvec3 getVec3d(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static bool getBool(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static bool getBool(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static int getInt(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static int getInt(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static float getFloat(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static float getFloat(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static double getDouble(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static double getDouble(
		const nlohmann::json& jsonNode,
		const std::string& key);

	CybertronCoreAPI static std::string getFilename(
		const nlohmann::json& jsonNode,
		const std::string& rootPath,
		const std::string& key);

	CybertronCoreAPI static std::string toString(
		const nlohmann::json& jsonNode);

	CybertronCoreAPI static std::string toString(
		const nlohmann::json& jsonNode,
		const std::string& key);

private:
	static const nlohmann::json smDummyNode;
};

CYBERTRON_END
